home *** CD-ROM | disk | FTP | other *** search
- /*
- File: GXEditDebug.c
-
- Contains:
-
- Written by: Barton R. House
-
- Copyright: © 1993 by Apple Computer, Inc., All rights reserved.
-
- */
-
- #include "GXEdit.h"
- #include "GXEditDoc.h"
- #include "GXEditError.h"
- #define _GXEditDebugPrivate_
- #include "GXEditDebug.h"
-
- #define kCheckAllMagic 0
-
- #define kMagic 0x7b
- #define kMagicSize 4
-
- typedef struct block {
- struct block ** next;
- struct block ** prev;
- Boolean isHandle;
- Boolean isLocked;
- Boolean hasMagic;
- union {
- long l;
- Ptr p;
- Handle h;
- } mem;
- unsigned long size;
- } BlockRec, * BlockPtr, ** BlockHan;
-
- static BlockHan MyBlocks = nil;
-
- static BlockHan FindBlock(long l);
- static void CheckPtrAccess(Ptr p, unsigned long size);
- static void CheckMagic(BlockHan block);
- static void SetMagic(BlockHan block);
-
- void gxEditHLock(Handle h)
- {
- BlockHan block;
-
- block = FindBlock((long) h);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- if((*block)->isLocked)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- HLock(h);
-
- (*block)->isLocked = true;
-
- }
-
- }
-
- }
-
- void gxEditHUnlock(Handle h)
- {
- BlockHan block;
-
- block = FindBlock((long) h);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- if(!(*block)->isLocked)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- HUnlock(h);
-
- (*block)->isLocked = false;
-
- }
-
- }
-
- }
-
- void gxEditSetHandleSize(Handle h, unsigned long size)
- {
- OSErr err;
- BlockHan block;
-
- block = FindBlock((long) h);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else if((*block)->isLocked)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- (*block)->size = size;
-
- SetHandleSize(h, size + kMagicSize);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else
- SetMagic(block);
-
- }
- }
-
- Handle gxEditNewHandle(long size)
- {
- OSErr err;
- Handle h;
- long * ptr;
- long count;
- BlockHan block;
-
- h = NewHandle(size + kMagicSize);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- /* intialize with garbage */
- ptr = (long *) *h;
- count = (size + 3)/4;
- while(count--) *ptr++ = 0xABCDEF12;
-
- block = AddBlock((long) h, size, true);
-
- if(block!= nil)
- SetMagic(block);
-
- return(h);
- }
-
- void gxEditDisposeHandle(Handle h)
- {
- OSErr err;
- BlockHan block;
- long * ptr;
- long size;
-
- block = FindBlock((long) h);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- if((*block)->isLocked)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- RemoveBlock((long) h);
-
- /* intialize with garbage */
- size = GetHandleSize(h);
- ptr = (long *) *h;
- size = (size + 3)/4;
- while(size--) *ptr++ = 0xABCDEF12;
-
- DisposeHandle(h);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- }
-
- }
-
- Ptr gxEditNewPtr(long size)
- {
- OSErr err;
- Ptr p;
- long * ptr;
- long count;
- BlockHan block;
-
- p = NewPtr(size + kMagicSize);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- /* intialize with garbage */
-
- ptr = (long *) p;
- count = (size + 3)/4;
- while(count--) *ptr++ = 0xABCDEF12;
-
- block = AddBlock((long) p, size, false);
-
- if(block!= nil)
- SetMagic(block);
-
- return(p);
- }
-
- void gxEditDisposePtr(Ptr p)
- {
- OSErr err;
- BlockHan block;
- long * ptr;
- long size;
-
- block = FindBlock((long) p);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- size = (*block)->size;
-
- RemoveBlock((long) p);
-
- /* intialize with garbage */
-
- ptr = (long *) p;
- size = (size + 3)/4;
- while(size--) *ptr++ = 0xABCDEF12;
-
- }
-
- DisposePtr(p);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- }
-
- void gxEditPtrAndHand(Ptr p, Handle h, unsigned long size)
- {
- OSErr err;
- BlockHan block;
-
- block = FindBlock((long) h);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- SetHandleSize(h, (*block)->size + size + kMagicSize);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- BlockMove(p, (Ptr) (*h + (*block)->size), size);
- (*block)->size += size;
-
- SetMagic(block);
-
- }
-
- }
-
-
- }
-
- void gxEditHandToHand(Handle *h)
- {
- OSErr err;
- BlockHan block;
- long size;
-
- block = FindBlock((long) *h);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- HandToHand(h);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- size = GetHandleSize((Handle) *h);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- if(!(*block)->hasMagic)
- SetHandleSize((Handle) *h, size + kMagicSize);
- else
- size -= kMagicSize;
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- block = AddBlock((long) *h, size, true);
-
- if(block!= nil)
- SetMagic(block);
-
- }
-
- }
-
- }
-
- }
-
- }
-
- void gxEditPtrToHand(Ptr p, Handle *h, unsigned long size)
- {
- OSErr err;
- BlockHan block;
-
- block = FindBlock((long) p);
-
- if(block == nil)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- PtrToHand(p, h, size);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- SetHandleSize((Handle) *h, size + kMagicSize);
-
- if((err = MemError()) != noErr)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- else {
-
- block = AddBlock((long) *h, size, true);
-
- if(block!= nil)
- SetMagic(block);
-
- }
-
- }
-
- }
-
- }
-
- void gxEditBlockMove(Ptr src, Ptr dst, unsigned long size)
- {
-
- if(size == 0)
- return;
-
- CheckPtrAccess(src, size);
- CheckPtrAccess(dst, size);
-
- BlockMove(src, dst, size);
-
- }
-
- long gxEditGetHandleSize(Handle h)
- {
- BlockHan block;
- unsigned long size;
-
- block = FindBlock((long) h);
-
- if(block == nil) {
-
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- size = 0;
-
- } else
- size = (*block)->size;
-
- return(size);
-
- }
-
- static BlockHan FindBlock(long l)
- {
- BlockHan block;
-
- block = MyBlocks;
-
- #if kCheckAllMagic
-
- while(block != nil) {
-
- CheckMagic(block);
-
- block = (*block)->next;
-
-
- }
-
- #endif
-
- block = MyBlocks;
-
- while(block != nil) {
-
- if((*block)->mem.l == l) {
- CheckMagic(block);
- return(block);
- }
-
- block = (*block)->next;
-
-
- }
-
- return(nil);
- }
-
- void * AddBlock(long l, unsigned long size, Boolean isHandle)
- {
- BlockHan blockHan;
- BlockPtr block;
- OSErr err;
-
- blockHan = (BlockHan) NewHandle(sizeof(BlockRec));
-
- if((err = MemError()) != noErr) {
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- return;
- }
-
- block = *blockHan;
-
- block->mem.l = l;
- block->size = size;
- block->isHandle = isHandle;
- block->isLocked = false;
- block->hasMagic = false;
-
- block->next = MyBlocks;
- block->prev = nil;
-
- if(block->next != nil)
- (*block->next)->prev = blockHan;
-
- MyBlocks = blockHan;
-
- return((void *) blockHan);
-
- }
-
- void RemoveBlock(long l)
- {
- BlockHan blockHan;
- BlockPtr block;
-
- blockHan = FindBlock(l);
-
- if(blockHan == nil) {
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- return;
- }
-
- block = *blockHan;
-
- if(block->prev == nil) {
-
- if(MyBlocks != blockHan) {
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- return;
- }
-
- MyBlocks = block->next;
-
- } else
- (*block->prev)->next = block->next;
-
- if(block->next != nil)
- (*block->next)->prev = block->prev;
-
- DisposeHandle((Handle) blockHan);
-
- }
-
- static BlockHan FindAddress(Ptr p)
- {
- BlockHan block;
- Ptr mem;
-
- p = StripAddress(p);
-
- block = MyBlocks;
-
- while(block != nil) {
-
- if((*block)->isHandle) {
-
- mem = StripAddress(*(*block)->mem.h);
-
- if(mem <= p && mem + (*block)->size > p)
- return(block);
-
- } else {
-
- mem = StripAddress((*block)->mem.p);
-
- if(mem <= p && mem + (*block)->size > p)
- return(block);
-
- }
-
- block = (*block)->next;
-
- }
-
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- return(nil);
-
- }
-
- static void CheckPtrAccess(Ptr p, unsigned long size)
- {
- BlockHan block;
- Ptr mem;
-
- p = StripAddress(p);
-
- if(p < (Ptr) SetCurrentA5() && p > (Ptr) &p)
- return; /* stack variable */
-
- if(p < (Ptr) GetZone() || p > (Ptr) GetApplLimit()) {
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- return;
- }
-
- block = FindAddress(p);
-
- if(block == nil)
- return;
-
- if((*block)->isHandle) {
-
- mem = StripAddress(*(*block)->mem.h);
-
- if((p+size) > (mem + (*block)->size)) {
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- return;
- }
-
- } else {
-
- mem = StripAddress((*block)->mem.p);
-
- if((p+size) > (mem + (*block)->size)) {
- gxEditPostError(nil, gx_edit_internal_fatal_error);
- return;
- }
-
- }
-
- }
-
- static void SetMagic(BlockHan block)
- {
- char * magic;
- short count;
-
- if((*block)->isHandle)
- magic = (char *) ((*(*block)->mem.h) + (*block)->size);
- else
- magic = (char *) ((*block)->mem.p + (*block)->size);
-
- count = kMagicSize;
-
- while(count--)
- *magic++ = kMagic;
-
- (*block)->hasMagic = true;
-
- }
-
- static void CheckMagic(BlockHan block)
- {
- char * magic;
- short count;
-
- if(!(*block)->hasMagic)
- return;
-
- if((*block)->isHandle)
- magic = (char *) ((*(*block)->mem.h) + (*block)->size);
- else
- magic = (char *) ((*block)->mem.p + (*block)->size);
-
- count = kMagicSize;
-
- while(count--)
- if(*magic++ != kMagic)
- gxEditPostError(nil, gx_edit_internal_fatal_error);
-
- }
-
-
-